/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ongd.negocio.gestion;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Clase que corresponde con la entidad subvencion de la base de datos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@Entity
@Table(name = "subvencion")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Subvencion.findAll", query = "SELECT s FROM Subvencion s"),
    @NamedQuery(name = "Subvencion.findByIdSubvencion", query = "SELECT s FROM Subvencion s WHERE s.subvencionPK.idSubvencion = :idSubvencion"),
    @NamedQuery(name = "Subvencion.findByEntidad", query = "SELECT s FROM Subvencion s WHERE s.entidad = :entidad"),
    @NamedQuery(name = "Subvencion.findByDescripcion", query = "SELECT s FROM Subvencion s WHERE s.descripcion = :descripcion"),
    @NamedQuery(name = "Subvencion.findByDocumentoAdjunto", query = "SELECT s FROM Subvencion s WHERE s.documentoAdjunto = :documentoAdjunto"),
    @NamedQuery(name = "Subvencion.findByFechaPresentacion", query = "SELECT s FROM Subvencion s WHERE s.fechaPresentacion = :fechaPresentacion"),
    @NamedQuery(name = "Subvencion.findByImporteSolicitado", query = "SELECT s FROM Subvencion s WHERE s.importeSolicitado = :importeSolicitado"),
    @NamedQuery(name = "Subvencion.findByImporteConcedido", query = "SELECT s FROM Subvencion s WHERE s.importeConcedido = :importeConcedido"),
    @NamedQuery(name = "Subvencion.findByResolucion", query = "SELECT s FROM Subvencion s WHERE s.resolucion = :resolucion"),
    @NamedQuery(name = "Subvencion.findByFechaTransferencia", query = "SELECT s FROM Subvencion s WHERE s.fechaTransferencia = :fechaTransferencia"),
    @NamedQuery(name = "Subvencion.findByFechaIngreso", query = "SELECT s FROM Subvencion s WHERE s.fechaIngreso = :fechaIngreso"),
    @NamedQuery(name = "Subvencion.findByProyectoidProyecto", query = "SELECT s FROM Subvencion s WHERE s.subvencionPK.proyectoidProyecto = :proyectoidProyecto")})
public class Subvencion extends Entidad implements Serializable {
    /*
     * Atributo serualVersionUID.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Atributo corresponde con la clave primaria.
     */
    @EmbeddedId
    protected SubvencionPK subvencionPK;
    /**
     * Atributo que corresponde con la entidad.
     */
    @Basic(optional = false)
    @Column(name = "Entidad")
    private String entidad;
    /**
     * Atributo que corresponde con la descripción.
     */
    @Column(name = "Descripcion")
    private String descripcion;
    /**
     * Atributo que corresponde con el documento adjunto.
     */
    @Column(name = "Documento_Adjunto")
    private String documentoAdjunto;
    @Basic(optional = false)
    /**
     * Atributo que corresponde con la fecha de presentación.
     */
    @Column(name = "Fecha_Presentacion")
    @Temporal(TemporalType.DATE)
    private Date fechaPresentacion;
    /**
     * Atributo que corresponde con el importe solicitado.
     */
    @Basic(optional = false)
    @Column(name = "Importe_Solicitado")
    private double importeSolicitado;
    /**
     * Atributo que corresponde con el importe concedido.
     */
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "Importe_Concedido")
    private Double importeConcedido;
    /**
     * Atributo que corresponde con la resolución.
     */
    @Column(name = "Resolucion")
    private String resolucion;
    /**
     * Atributo que corresponde con la fecha de transferencia.
     */
    @Column(name = "Fecha_Transferencia")
    @Temporal(TemporalType.DATE)
    private Date fechaTransferencia;
    /**
     * Atributo que corresponde con la fecha de ingreso.
     */
    @Column(name = "Fecha_Ingreso")
    @Temporal(TemporalType.DATE)
    private Date fechaIngreso;
    /**
     * Atributo que corresopnde con el proyecto al que está asociada la 
     * subvención.
     */
    @JoinColumn(name = "Proyecto_idProyecto", referencedColumnName = "idProyecto", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Proyecto proyecto;

    /**
     * Constructor de la clase.
     */
    public Subvencion() {
    }
    
    /**
     * Constructor de la clase.
     * @param subvencionPK Clave primaria de la subvención
     */
    public Subvencion(SubvencionPK subvencionPK) {
        this.subvencionPK = subvencionPK;
    }

    /**
     * Constructo de la clase.
     * @param subvencionPK Clave primaria
     * @param entidad Entidad de la subvención
     * @param fechaPresentacion Fecha de presentación de la misma
     * @param importeSolicitado Importe solicitado de la misma
     */
    public Subvencion(SubvencionPK subvencionPK, String entidad, Date fechaPresentacion, double importeSolicitado) {
        this.subvencionPK = subvencionPK;
        this.entidad = entidad;
        this.fechaPresentacion = fechaPresentacion;
        this.importeSolicitado = importeSolicitado;
    }

    /**
     * Constructor de la subvención.
     * @param idSubvencion Identificador de la subvención
     * @param proyectoidProyecto Proyecto al que está asociada la subvención
     */
    public Subvencion(int idSubvencion, int proyectoidProyecto) {
        this.subvencionPK = new SubvencionPK(idSubvencion, proyectoidProyecto);
    }

    /**
     * Método que devuelve el valor de la variable subvencionPK.
     * @return subvenciónPK
     * @see #setSubvencionPK
     */
    public SubvencionPK getSubvencionPK() {
        return subvencionPK;
    }

    /**
     * Método que establece el valor de la variable subvencionPK.
     * @param subvencionPK Nuevo valor de la varible
     * @see #getSubvencionPK
     */
    public void setSubvencionPK(SubvencionPK subvencionPK) {
        this.subvencionPK = subvencionPK;
    }

     /**
     * Método que devuelve el valor de la variable entidad.
     * @return entidad
     * @see #setEntidad
     */
    public String getEntidad() {
        return entidad;
    }

    /**
     * Método que establece el valor de la variable entidad.
     * @param entidad Nuevo valor de la varible
     * @see #getEntidad
     */
    public void setEntidad(String entidad) {
        this.entidad = entidad;
    }

     /**
     * Método que devuelve el valor de la variable descripcion.
     * @return descripcion
     * @see #setDescripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * Método que establece el valor de la variable descripción.
     * @param descripcion Nuevo valor de la varible
     * @see #getDescripcion
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

     /**
     * Método que devuelve el valor de la variable documentoAdjunto.
     * @return documentoAdjunto
     * @see #setDocumentoAdjunto
     */
    public String getDocumentoAdjunto() {
        return documentoAdjunto;
    }

    /**
     * Método que establece el valor de la variable documentoAdjunto.
     * @param documentoAdjunto Nuevo valor de la varible
     * @see #getDocumentoAdjunto
     */
    public void setDocumentoAdjunto(String documentoAdjunto) {
        this.documentoAdjunto = documentoAdjunto;
    }

     /**
     * Método que devuelve el valor de la variable fechaPresentacion.
     * @return fechaPresentacion
     * @see #setFechaPresentacion
     */
    public Date getFechaPresentacion() {
        return fechaPresentacion;
    }

    /**
     * Método que establece el valor de la variable fechaPresentacion.
     * @param fechaPresentacion Nuevo valor de la varible
     * @see #getFechaPresentacion
     */
    public void setFechaPresentacion(Date fechaPresentacion) {
        this.fechaPresentacion = fechaPresentacion;
    }

     /**
     * Método que devuelve el valor de la variable importeSolicitado.
     * @return importeSolicitado
     * @see #setImporteSolicitado
     */
    public double getImporteSolicitado() {
        return importeSolicitado;
    }

    /**
     * Método que establece el valor de la variable importeSolicitado.
     * @param importeSolicitado Nuevo valor de la varible
     * @see #getImporteSolicitado
     */
    public void setImporteSolicitado(double importeSolicitado) {
        this.importeSolicitado = importeSolicitado;
    }

     /**
     * Método que devuelve el valor de la variable importeConcedido.
     * @return importeConcedido
     * @see #setImporteConcedido
     */
    public Double getImporteConcedido() {
        return importeConcedido;
    }

    /**
     * Método que establece el valor de la variable importeConcedido.
     * @param importeConcedido Nuevo valor de la varible
     * @see #getImporteConcedido
     */
    public void setImporteConcedido(Double importeConcedido) {
        this.importeConcedido = importeConcedido;
    }

     /**
     * Método que devuelve el valor de la variable resolucion.
     * @return resolucion
     * @see #setResolucion
     */
    public String getResolucion() {
        return resolucion;
    }

    /**
     * Método que establece el valor de la variable resolucion.
     * @param resolucion Nuevo valor de la varible
     * @see #getResolucion
     */
    public void setResolucion(String resolucion) {
        this.resolucion = resolucion;
    }

     /**
     * Método que devuelve el valor de la variable fechaTransferencia.
     * @return fechaTransferencia
     * @see #setFechaTransferencia
     */
    public Date getFechaTransferencia() {
        return fechaTransferencia;
    }

    /**
     * Método que establece el valor de la variable fechaTransferencia.
     * @param fechaTransferencia Nuevo valor de la varible
     * @see #getFechaTransferencia
     */
    public void setFechaTransferencia(Date fechaTransferencia) {
        this.fechaTransferencia = fechaTransferencia;
    }

     /**
     * Método que devuelve el valor de la variable fechaIngreso.
     * @return fechaIngreso
     * @see #setFechaIngreso
     */
    public Date getFechaIngreso() {
        return fechaIngreso;
    }

    /**
     * Método que establece el valor de la variable fechaIngreso.
     * @param fechaIngreso Nuevo valor de la varible
     * @see #getFechaIngreso
     */
    public void setFechaIngreso(Date fechaIngreso) {
        this.fechaIngreso = fechaIngreso;
    }

     /**
     * Método que devuelve el valor de la variable proyecto.
     * @return proyecto
     * @see #setProyecto
     */
    public Proyecto getProyecto() {
        return proyecto;
    }

    /**
     * Método que establece el valor de la variable proyecto.
     * @param proyecto Nuevo valor de la varible
     * @see #getProyecto 
     */
    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    /**
     * Método que indicea si una subvención esta pendiente.
     * @return true o false en funcion de la resolución de la subvencion
     */
    public boolean estaPendiente() {
        return resolucion.compareTo("P") == 0;
    }

    /**
     * Método que indicea si una subvención esta concedida.
     * @return true o false en funcion de la resolución de la subvencion
     */
    public boolean estaConcedida() {
        return resolucion.compareTo("C") == 0;
    }

    /**
     * Método que indicea si una subvención esta rechazada.
     * @return true o false en funcion de la resolución de la subvencion
     */
    public boolean estaRechazada() {
        return resolucion.compareTo("R") == 0;
    }

    /**
     * Método que devuelve un número con una propiedad fundamental, si dos 
     * objetos son iguales el valor retornado por sus respectivos hashCode 
     * debe ser igual.
     * @return hash
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (subvencionPK != null ? subvencionPK.hashCode() : 0);
        return hash;
    }

    /**
     * Método que compara si dos subvenciones son iguales.
     * @param object Objeto a comparar
     * @return true o false
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Subvencion)) {
            return false;
        }
        Subvencion other = (Subvencion) object;
        if ((this.subvencionPK == null && other.subvencionPK != null) || (this.subvencionPK != null && !this.subvencionPK.equals(other.subvencionPK))) {
            return false;
        }
        return true;
    }

    /**
     * Método que devuelve una cadena con subvencion.
     * @return string
     */
    @Override
    public String toString() {
        return "ongd.negocio.entidades.Subvencion[ subvencionPK=" + subvencionPK + " ]";
    }
}
